
class Animal {
    public String name;
    public int age;
    static {
        System.out.println("父类静态方法....");
    }

    {
        System.out.println("父类实例化方法....");
    }
    public Animal(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("父类构造方法....");
    }
    public void eat() {
        System.out.println(this.name + "正在吃...");
    }
}

final class Dog extends Animal {
    public String color;
    static {
        System.out.println("子类静态方法....");
    }

    {
        System.out.println("子类实例化方法.....");
    }
    public Dog(String name,int age,String color) {
        super(name,age);
        this.color = color;
        System.out.println("子类构造方法.....");
    }
    public void barks() {
        System.out.println(this.name + "正在汪汪汪叫....");
    }
}
class Cat extends Animal {
    public Cat(String name,int age) {
        super(name,age);
    }
    public void miaomiao() {
        System.out.println(this.name + "喵喵叫....");
    }
}
public class Test {
    public static void main(String[] args) {
        //继承方式：单继承、多层继承、多个类继承同一类
        //不支持多继承->接口
        //多层继承一般不建议超过三层
        //可以使用final控制层数
        //final：final字段 属性：不可更改、final方法：不能被重写、final类：不能被继承
    }
    public static void main2(String[] args) {
        Dog dog1 = new Dog("小黑",2,"黑色");
        System.out.println("-------------");
        Dog dog2 = new Dog("小灰",3,"灰色");
        //再谈初始化
        //4.方法先后顺序
        //4.1先父类静态方法,再父类实例化、构造方法，最后子类实例化、构造方法
        //4.2静态方法只执行一次
    }
    public static void main1(String[] args) {
        //继承extends:对共性的抽取,代码复用 （is -> a 的关系）
        Dog dog = new Dog("大黄",2,"黄色");
        dog.eat();
        dog.barks();

        Cat cat = new Cat("咪咪",2);
        cat.eat();
        //1.子类构造方法：先有父再有子，所以使用父类成员时，必须先对父类的变量，进行初始化，而且只能通过子类构造方法进行初始化
        //1.1如果父类没有提供构造方法，则编译器会自动在子类构造方法中提供一个隐式构造方法（super语句隐藏在第一行）
        //1.2如果父类构造方法有参，则在子类构造方法中，需要使用super调用父类构造方法否则编译失败
        //1.3super引用和this引用都必须放在第一行
        //1.4super引用只能出现在子类构造方法中依次，并且不能与this同时出现
        //2.this 和 super的区别
        //2.1super -> super.父类成员变量、super.父类成员方法、super(父类构造方法)
        //2.1this  -> this.成员变量、this.成员方法、this(构造方法)
        //2.2this是当前对象的引用，super是子类继承父类对象属性方法的引用
        //2.3this调用本类属性、方法等 super调用父类属性、方法等
        //2.4在构造方法中：this(...)用于调用本类构造方法，super(...)用于调用父类构造方法，两种调用不能同时在构造方法中出现
        //2.5构造方法中，super构造方法一定在第一行，且一定存在，没有写，编译器也会默认添加，this,不写就没有
    }
}
